package qc.module.platform.api.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import qc.common.core.constants.QCAuthConstant;
import qc.common.core.exception.QCPromptException;
import qc.module.platform.dto.uac.*;
import qc.module.platform.service.MenusService;
import qc.module.platform.service.UserAccessControlService;
import qc.module.platform.service.UserLoginLogService;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 用户控制 Controller
 * 用于用户登录、退出、获取个人信息、获取权限控制及权限资源等操作
 *
 * @author QuCheng Tech
 * @create 2023/1/9
 */
@RestController
@RequestMapping("/uac")
public class UserAccessControlController {
    private UserAccessControlService uacService;

    private UserLoginLogService userLoginLogService;

    private MenusService menusService;

    @Autowired
    public void setUserAccessControlService(UserAccessControlService service) {
        this.uacService = service;
    }

    @Autowired
    public void setUserLoginLogService(UserLoginLogService service) {
        this.userLoginLogService = service;
    }

    @Autowired
    public void setMenusService(MenusService menusService) {
        this.menusService = menusService;
    }

    @Autowired
    HttpServletRequest request;

    /**
     * 用户登录，返回登录结果
     *
     * @param dto 登录输入信息，包含登录验证方式、输入的登录名和密码
     * @return 登录结果中包含是否成功、用户名称、token和项目集合
     * @author QuCheng Tech
     * @since 2023/5/28
     */
    @RequestMapping(value = "/login", method = {RequestMethod.GET, RequestMethod.POST})
    public LoginResultDto login(@RequestBody LoginDto dto) throws QCPromptException {
        //客户端信息可以从request中获取
        String userAgent = request.getHeader(QCAuthConstant.USER_AGENT_HEADER_KEY);

        //权限验证需要token，获取token
        String token = request.getHeader(QCAuthConstant.TOKEN_HEADER_KEY);

        //根据客户端userAgent可以设置之前的登录记录为过期，避免历史token可重复使用问题
        //在Service中的login方法中进行统一处理；在向登录日志表中写入记录后对原有的登录记录设置token过期

        return uacService.login(dto, userAgent, token);
    }

    /**
     * 获取用户信息，从请求头中的token获取
     *
     * @return 用户信息，包含ID、名称、手机号、项目编码
     * @author QuCheng Tech
     * @since 2023/5/28
     */
    @GetMapping("/userinfo")
    public UacUserInfoDto getUserInfo() {
        //权限验证需要token，获取token
        String token = request.getHeader(QCAuthConstant.TOKEN_HEADER_KEY);

        return uacService.getUacUserInfoByToken(token);
    }

    @RequestMapping(value = "/modifypwd", method = {RequestMethod.GET, RequestMethod.POST})
    public String modifyPassword(@RequestBody UserModifyPasswordDto dto) throws QCPromptException {
        //权限验证需要token，获取token
        String token = request.getHeader(QCAuthConstant.TOKEN_HEADER_KEY);

        return uacService.modifyUserPassword(token, dto);
    }

    @GetMapping("/logout")
    public String logout() {
        //在此可以获取客户端userAgent，退出登录时可以将同类型客户端所有登录记录均设置为过期，避免token重复使用

        //权限验证需要token，获取token
        String token = request.getHeader(QCAuthConstant.TOKEN_HEADER_KEY);

        return uacService.logout(token);
    }

    /***
     * 获取菜单列表，根据登录用户token和指定的项目编码
     *
     * @param id 项目编码
     * @return java.util.List<qc.module.platform.dto.uac.UacMenuDto>
     * @author QuCheng Tech
     * @since 2023/8/15
     */
    @GetMapping(value = "/menuList/{id}")
    public List<UacRouteDto> getMenuListByPath(@PathVariable(required = true) String id) throws QCPromptException {
        //权限验证需要token，获取token
        String token = request.getHeader(QCAuthConstant.TOKEN_HEADER_KEY);

        return uacService.getProjectValidMenus(token, id);
    }

    /***
     * 获取菜单列表，根据登录用户token和指定的项目编码
     *
     * @param id 项目编码
     * @return java.util.List<qc.module.platform.dto.uac.UacMenuDto>
     * @author QuCheng Tech
     * @since 2023/8/15
     */
    @GetMapping(value = "/menuList")
    public List<UacRouteDto> getMenuListByParam(@RequestParam(required = true) String id) throws QCPromptException {
        //权限验证需要token，获取token
        String token = request.getHeader(QCAuthConstant.TOKEN_HEADER_KEY);

        return uacService.getProjectValidMenus(token, id);
    }
}
